package cn.regexp.job.service.jobhandler;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.regexp.job.enums.JobRedisKeyEnum;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Set;

/**
 * @author Regexpei
 * @date 2024/7/5 23:02
 * @description 用户缓存任务
 * <p>为了保证Redis中的内存的有效使用，默认保留7天内的用户缓存数据，每天凌晨将7天前的用户登录缓存数据删除掉</p>
 */
@Component
public class UserCacheJob {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @XxlJob("clearUserCache")
    public void clearUserCache() {
        XxlJobHelper.log("UserCacheJob: clear user cache, start.");
        // 获取 7 天前的时间
        DateTime dateTime = DateUtil.offsetDay(DateTime.now(), -7);
        long maxTime = dateTime.getTime();

        String userZsetKey = JobRedisKeyEnum.USER_ZSET.getRealKey("");
        String userHashKey = JobRedisKeyEnum.USER_HASH.getRealKey("");

        // 获取从时间戳为 0 到当前时间的 7 天前时间戳的所有 userKey
        Set<String> ids = redisTemplate.opsForZSet().rangeByScore(userZsetKey, 0, maxTime);
        if (ids == null) {
            return;
        }

        // 删除7天前的用户缓存数据
        if (!ids.isEmpty()) {
            // 通过 userKey 删除 hash
            redisTemplate.opsForHash().delete(userHashKey, ids.toArray());
        }
        // 清除七天前的 userKey
        redisTemplate.opsForZSet().removeRangeByScore(userZsetKey, 0, maxTime);

        XxlJobHelper.log("UserCacheJob: clear user cache, finish.");
    }
}
